package cliente.iu;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.rmi.RemoteException;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

import cliente.rn.RNAutenticador;
import cliente.so.SOGeradorPopup;
import cliente.so.SOPopup;
import cliente.so.SOControladoraClienteIU;

import comum.so.exception.FalhaComunicacaoBancoDadosException;
import comum.so.exception.JaExistePerfilCadastradoComEsseLoginException;

public class IUCadastroNovoUsuario extends JPanel {

	private static final long serialVersionUID = 4423570957280411650L;

	private SOControladoraClienteIU controladoraClienteIU;

	private RNAutenticador autenticador;

	private JTextField textFieldIdentificador;
	private JPasswordField textFieldSenha;
	private JPasswordField textFieldConfirmarSenha;

	public IUCadastroNovoUsuario(SOControladoraClienteIU controladoraIU,
			RNAutenticador autenticador) {
		definirPanel();

		this.setControladoraClienteIU(controladoraIU);
		this.setAutenticador(autenticador);
	}

	private void definirPanel() {
		setBounds(100, 100, 450, 300);
		setLayout(null);
		setBorder(new EmptyBorder(5, 5, 5, 5));

		JLabel lblCadastroNovoUsuario = new JLabel(
				"Cadastro - Novo Usu\u00E1rio");
		lblCadastroNovoUsuario.setFont(new Font("Times New Roman", Font.BOLD,
				16));
		lblCadastroNovoUsuario.setBounds(42, 24, 177, 37);
		add(lblCadastroNovoUsuario);

		JLabel lblIdentificador = new JLabel("Identificador");
		lblIdentificador.setBounds(42, 138, 103, 14);
		add(lblIdentificador);

		JLabel lblSenha = new JLabel("Senha (8 d\u00EDgitos)");
		lblSenha.setBounds(42, 174, 103, 14);
		add(lblSenha);

		JLabel lblConfirmar = new JLabel("Confirmar Senha");
		lblConfirmar.setBounds(42, 240, 103, 14);
		add(lblConfirmar);

		setTextFieldIdentificador(new JTextField());
		getTextFieldIdentificador().setBounds(175, 135, 294, 20);
		add(getTextFieldIdentificador());
		getTextFieldIdentificador().setColumns(10);

		setTextFieldSenha(new JPasswordField());
		getTextFieldSenha().setBounds(175, 171, 294, 20);
		add(getTextFieldSenha());
		getTextFieldSenha().setColumns(10);

		setTextFieldConfirmarSenha(new JPasswordField());
		getTextFieldConfirmarSenha().setBounds(175, 237, 294, 20);
		add(getTextFieldConfirmarSenha());
		getTextFieldConfirmarSenha().setColumns(10);

		JLabel lblCaracteres = new JLabel("(caracteres de 0-9 e de A-Z)");
		lblCaracteres.setBounds(175, 202, 209, 14);
		add(lblCaracteres);

		JButton btnConfirmar = new JButton("Confirmar");
		btnConfirmar.setBounds(175, 287, 124, 23);
		add(btnConfirmar);

		JButton btnCancelar = new JButton("Cancelar");
		btnCancelar.setBounds(345, 287, 124, 23);
		add(btnCancelar);

		JButton btnSair = new JButton("Sair");
		btnSair.setBounds(542, 11, 74, 23);
		add(btnSair);
		setVisible(true);
		setSize(new Dimension(640, 480));

		btnSair.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent evt) {
				btnSairActionPerformed();
			}
		});

		btnCancelar.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent evt) {
				btnCancelarActionPerformed();
			}
		});

		btnConfirmar.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent evt) {
				btnConfirmarActionPerformed();
			}
		});

		getTextFieldSenha().addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				if (getTextFieldSenha().getPassword().length >= 8
						|| e.getKeyChar() == ' ') {
					e.consume();
				}
			}
		});

		getTextFieldConfirmarSenha().addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				if (getTextFieldConfirmarSenha().getPassword().length >= 8
						|| e.getKeyChar() == ' ') {
					e.consume();
				}
			}
		});
	}

	private void btnConfirmarActionPerformed() {
		String password = new String(getTextFieldSenha().getPassword());
		String passwordConfirmar = new String(
				getTextFieldConfirmarSenha().getPassword());
		String padrao = "^+[a-zA-z0-9]+$";
		if (password.matches(padrao) && password.equals(passwordConfirmar)) {
			try {
				getAutenticador().cadastrarNovoPerfil(getTextFieldIdentificador()
						.getText(), new String(getTextFieldSenha().getPassword()));
				getControladoraClienteIU().abrirSalaPrincipal();
			} catch (RemoteException e) {
				e.printStackTrace();
				SOGeradorPopup.getPopup(SOPopup.CONEXAO_PERDIDA);
			} catch (FalhaComunicacaoBancoDadosException e) {
				e.printStackTrace();
				SOGeradorPopup.getPopup(SOPopup.ERRO_SERVIDOR);
			} catch (JaExistePerfilCadastradoComEsseLoginException e) {
				e.printStackTrace();
				SOGeradorPopup.getPopup(SOPopup.ID_JA_EXISTE);
			}
		} else {
			SOGeradorPopup.getPopup(SOPopup.ERRO_NO_PREENCHIMENTO);
		}

	}

	private void btnSairActionPerformed() {
		getControladoraClienteIU().encerrarAplicacao();
	}

	private void btnCancelarActionPerformed() {
		getControladoraClienteIU().abrirTelaLogin();
	}

	protected SOControladoraClienteIU getControladoraClienteIU() {
		return controladoraClienteIU;
	}

	protected void setControladoraClienteIU(SOControladoraClienteIU controladoraClienteIU) {
		this.controladoraClienteIU = controladoraClienteIU;
	}

	protected RNAutenticador getAutenticador() {
		return autenticador;
	}

	protected void setAutenticador(RNAutenticador autenticador) {
		this.autenticador = autenticador;
	}

	protected JTextField getTextFieldIdentificador() {
		return textFieldIdentificador;
	}

	protected void setTextFieldIdentificador(JTextField textFieldIdentificador) {
		this.textFieldIdentificador = textFieldIdentificador;
	}

	protected JPasswordField getTextFieldSenha() {
		return textFieldSenha;
	}

	protected void setTextFieldSenha(JPasswordField textFieldSenha) {
		this.textFieldSenha = textFieldSenha;
	}

	protected JPasswordField getTextFieldConfirmarSenha() {
		return textFieldConfirmarSenha;
	}

	protected void setTextFieldConfirmarSenha(JPasswordField textFieldConfirmarSenha) {
		this.textFieldConfirmarSenha = textFieldConfirmarSenha;
	}
}
